//全局函数区域,函数文件区域
#include<stdio.h>
#include<string.h>
//声明函数区域;
void test1();//动动手作业0
void test2();//将代码实现横屏打印
/*	
	函数认识：
   
   函数在编程中，函数（或称为方法、子程序）是一段特定的代码块，它执行一个单一的任务并可以被程序的其他部分重复调用。
   函数的主要目的是将程序分解为更小、更可管理的部分，使代码更易于理解和维护。函数可以接受输入参数，并根据这些参数执行相应的操作。
   此外，函数还可以返回一个值作为输出。

   函数高阶理解： https://www.runoob.com/cprogramming/c-functions.html

   不过这节课小甲鱼讲的很清楚了，你可以看看文档

*/

//
//第一个程序
//用函数实现打印'FishC'

//定于函数
void print_F();//打印'F'
void print_I();//打印'I'
void print_S();//打印'S'
void print_H();//打印'H'
void print_C();//打印'C'

void print_F()
{
   printf("########\n");
   printf("##      \n");
   printf("##      \n");
   printf("######  \n");
   printf("##      \n");
   printf("##      \n");
   printf("##      \n");
}

void print_I()
{
   printf("####\n");
   printf(" ## \n");
   printf(" ## \n");
   printf(" ## \n");
   printf(" ## \n");
   printf(" ## \n");
   printf("####\n");
}

void print_S()
{
   printf(" ###### \n");
   printf("##    ##\n");
   printf("##      \n");
   printf(" ###### \n");
   printf("      ##\n");
   printf("##    ##\n");
   printf(" ###### \n");
}

void print_H()
{
   printf("##    ##\n");
   printf("##    ##\n");
   printf("##    ##\n");
   printf("########\n");
   printf("##    ##\n");
   printf("##    ##\n");
   printf("##    ##\n");
}

void print_C()
{
   printf(" ###### \n");
   printf("##    ##\n");
   printf("##      \n");
   printf("##      \n");
   printf("##      \n");
   printf("##    ##\n");
   printf(" ###### \n");
}

//程序1
//竖向打印字符串
void test1()
{
   print_F();
   printf("\n");
   print_I();
   printf("\n");
   print_S();
   printf("\n");
   print_H();
   printf("\n");
   print_C();
   printf("\n");
}


//程序2
//实现横屏打印HACKED

//定于每一个字符占行为7

/*第一行的反斜杠'/'其实是一个续行符（是转移字符的一种），它的作用是告诉编译器下一行的文本是当前字符串的一部分，而不是一个新的字符串。
       这在代码格式化时很有用，可以让字符串的每一行在源代码中单独显示，提高代码的可读性。
       但是需要注意的是，这个反斜杠后面不能有任何字符，否则编译器会报错
       例如：
       const char* letters[] = {
       "\abc"  // 错误的用法，反斜杠后面不能有字符
   }

       转义字符：
       转义字符是指在字符串中使用反斜杠（\）来表示一些特殊字符或控制字符。这些特殊字符在编程语言中具有特定的含义，而不是它们字面的含义。
       通过使用转义字符，可以在字符串中包含这些特殊字符。

       以下是一些常见的转义字符及其含义：
       \n：换行符，将光标移动到下一行的开头。
       \t：制表符，将光标移动到下一个制表位。
       \\：反斜杠字符本身。
       \'：单引号字符。
       \"：双引号字符。
       \0：空字符，表示字符串的结束。
   */

//这里定义了一个常量指针数组，将每一个字符图形视作一个字符串
const char* letters[] = {
"\
\##         ##@\
\##         ##@\
\##         ##@\
\#############@\
\##         ##@\
\##         ##@\
\##         ##@\
",
"\
\       #       @\
\     # # #     @\
\    ##   ##    @\
\   #########   @\
\  ##       ##  @\
\ ##         ## @\
\##           ##@\
",
"\
\ ############ @\
\##          ##@\
\##            @\
\##            @\
\##            @\
\##          ##@\
\ ############ @\
",
"\
\##          ##@\
\##      ##    @\
\##   ##       @\
\####          @\
\##  ##        @\
\##       ##   @\
\##          ##@\
",
"\
\#############@\
\##           @\
\##           @\
\#############@\
\##           @\
\##           @\
\#############@\
",
"\
\###########  @\
\##         ##@\
\##         ##@\
\##         ##@\
\##         ##@\
\##         ##@\
\###########  @\
"

};
void test2()
{
   int gap;
   printf("请输入字符间隔：");
   scanf("%d", &gap);

   int HEIGHT = 7;//每个字符串（也就是字符图形的高为7）
   int i, j;
   for (i = 0; i < HEIGHT; i++)
   {
       for (j = 0; j < 6; j++)
       {
           int k = 0;//用于迭代每行'#'字符
           //计算现在字母每行有多少个字符
           int len = strlen(letters[j]) / HEIGHT;//遍历每个字符串，计算出一个字符串的每行宽度
           //计算当前打印第几行
           int line = i * len;

           //遇到 @ 时则标志改行结束;当遇到 # 打印
           while (letters[j][line + k] != '@')
           {
               putchar(letters[j][line + k]);
               k++;
           }

           //打印字符间的间隔(空格)
           int temp = gap;
           while (temp--)
           {
               putchar(' ');
           }

       }
       putchar('\n');
   }
   

}



//主函数区域;
int main()
{
   test2();
   return 0;
}